From f004fd7cbbba9f3d58b399d5becfe4e8c5230fb6 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 29 Jun 2021 12:33:37 +0200 Subject: [PATCH] x86emul: avoid using _PRE_EFLAGS() in a few cases The macro expanding to quite a few insns, replace its use by simply clearing the status flags when the to be executed insn doesn't depend on their initial state, in cases where this is easily possible. (There are more cases where the uses are hidden inside macros, and where some of the users of the macros want guest flags put in place before running the insn, i.e. the macros can't be updated as easily.) Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- xen/arch/x86/x86_emulate/x86_emulate.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 45828b726b..c9a9e031cf 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -6864,7 +6864,8 @@ x86_emulate( } opc[2] = 0xc3; - invoke_stub(_PRE_EFLAGS("[eflags]", "[mask]", "[tmp]"), + _regs.eflags &= ~EFLAGS_MASK; + invoke_stub("", _POST_EFLAGS("[eflags]", "[mask]", "[tmp]"), [eflags] "+g" (_regs.eflags), [tmp] "=&r" (dummy), "+m" (*mmvalp) @@ -8112,7 +8113,8 @@ x86_emulate( opc[2] = 0xc3; copy_VEX(opc, vex); - invoke_stub(_PRE_EFLAGS("[eflags]", "[mask]", "[tmp]"), + _regs.eflags &= ~EFLAGS_MASK; + invoke_stub("", _POST_EFLAGS("[eflags]", "[mask]", "[tmp]"), [eflags] "+g" (_regs.eflags), "=a" (dst.val), [tmp] "=&r" (dummy) @@ -11699,13 +11701,14 @@ int x86_emul_rmw( break; case rmw_xadd: + *eflags &= ~EFLAGS_MASK; switch ( state->op_bytes ) { unsigned long dummy; #define XADD(sz, cst, mod) \ case sz: \ - asm ( _PRE_EFLAGS("[efl]", "[msk]", "[tmp]") \ + asm ( "" \ COND_LOCK(xadd) " %"#mod"[reg], %[mem]; " \ _POST_EFLAGS("[efl]", "[msk]", "[tmp]") \ : [reg] "+" #cst (state->ea.val), \ -- 2.30.2